package com.mhfelipe.sandbox.prevayler.prevalence;

import com.mhfelipe.sandbox.prevayler.prevalence.entity.Funcionario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: mhfelipe
 * Date: 2/2/12
 * Time: 3:43 PM
 * To change this template use File | Settings | File Templates.
 */
public class Empresa implements Serializable {

    List<Funcionario> funcionarioList = new ArrayList<Funcionario>();

    public List<Funcionario> getFuncionarioList() {
        return funcionarioList;
    }

    public void setFuncionarioList(List<Funcionario> funcionarioList) {
        this.funcionarioList = funcionarioList;
    }

}

/*

 Prevayler é um framework de prevalencia criado por brasileiros.

 Quando Klaus pede pra escolher entre as pilulas vermelha e azul (lembrando a cena entre Morpheus e Neo no filme Matrix),
 nós rimos e fingimos que esquecemos os conceitos realacionais de banco de dados. Porém quando voce começa a implementar
 seu modelo de dados, esta é a hora de você engolir uma das duas.

 O primeiro passo é definir quem será sua prevalência.

 Neste exemplo, o modelo de persistencia de dados será construido em cima de uma classe empresa, seguindo o conceito
 que é a empresa que tem os funcionarios, é a empresa que possui todas as vendas, é a empresa que tem todas
 as compras e tudo mais. Nada impede que esta classe prevalente seja o nome da própria aplicação.

 O Prevayler é iniciado de apenas uma maneira, porém pode ser parametrizados de diversas, entre elas de modo independente,
 servidor ou cliente.

 No modo independente iniciaríamos da seguinte forma:

 1 PrevaylerFactory factory = new PrevaylerFactory();
 2 factory.configurePrevalentSystem(new Empresa());
 3 factory.configurePrevalenceDirectory("data");

 1: criasse uma instância do prevayler;
 2: define quem é a classe prevalente do seu sistema (a raiz da árvore);
 3: define em qual pasta serão persistidos os journals e snapshots.

 Segundo Klaus, o prevayler possui a terceira melhor forma de persistencia que existe no mundo. A primeira seria
 a persistencia transacional (journals), a segunda seria a persistencia em lote (snapshot) e a terceira, logicamente,
 a disposição das duas.

 A persistencia de modo transacional é extremamente veloz quando se trata em persistir os dados, pois este processo
 trata apenas de um registro. Porém perde esta velocidade, comparado com o snapshot, quando se trata de recuperar
 os dados persistidos. O snapshot são os dados consolidados, ou seja, agrupados, portanto sua capacidade de recuperação
 é extremamente rápida comparado ao transacional.

 Para configurá-lo de maneira a distribuir os dados persistidos, deverá ser adicionada um parâmetro na aplicação servidor
 avisando de sua tarefa, e outra linha no cliente avisando quem é o servidor.

 Na aplicação servidor:
 4 factory.configureReplicationServer(PrevaylerFactory.DEFAULT_REPLICATION_PORT);

 Na aplicação cliente:
 4 factory.configureReplicationClient("localhost", PrevaylerFactory.DEFAULT_REPLICATION_PORT);

*/